﻿// owner 蒋家伟

#pragma once
#include "Application_home.h"

namespace jsdk
{
    enum class ApplicationStatus;
    // 类别说明 ：全局单例，在main函数中创建并启动
    class APPLICATION_EXPORT IApplication
    {
    public:
        virtual ~IApplication() {}

        /// \ brief 创建一个程序对象
        /// \ in argc cmd 命令行输入的参数个数
        /// \ in argv     命令集合
        /// \ return IApplication
        static IApplication* create(int &argc, char **argv);

        /// \ brief 获取创建过的程序对象
        static IApplication* get();

        /// \ brief 判断当前程序是否已经启动过一个
        /// \ note : 所谓的启动是指调用了Start
        static bool isRunning();

        /// \ brief 获取当前程序所处的状态
        /// \ return ApplicationStatus 程序所处的状态
        static const ApplicationStatus& getApplicationStatus();

        /// \ brief 当程序启动后可以获取当前App运行的文件夹路径
        /// \ return 文件路径
        static const std::wstring& applicationDirPath();

        /// \ brief 完全关闭后并重启当前软件
        static bool restart();

        /// \ brief 根据屏幕的下标获取屏幕的长宽
        /// \ in index 屏幕下标，支持多屏
        /// \ out width 对应下标屏幕的宽度
        /// \ out height 对应下标屏幕的高度
        /// \ return true 获取成功，false 获取失败。(失败的原因可能是对应下标没有对应的屏幕)
        static bool getScreenGeometry(int index, uint16_t& width, uint16_t& hegiht);

    public:
        /// \ 启动主事件循环
        /// \ 可以在main直接调用return Start() 即可
        virtual int start() const = 0;

        /// \ 退出主事件循环，关闭程序
        virtual void exit() = 0;

        /// \ 获取命令行参数
        /// \ return 命令行参数集合
        virtual std::vector<std::string> getCmdParameter() const = 0;

    protected:
        static IApplication* s_pApplication;
    };
}
